home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr49 / strpp300.zip / DEMO.CPP next >
C/C++ Source or Header  |  1993-04-11  |  17KB  |  526 lines

  1. /* -------------------------------------------------------------------- */
  2. /* String++ Version 3.00                                       04/10/93 */
  3. /*                                                                      */
  4. /* Enhanced string class for Turbo C++/Borland C++.                     */
  5. /* Copyright 1991-1993 by Carl W. Moreland                              */
  6. /*                                                                      */
  7. /* demo.cpp                                                             */
  8. /* -------------------------------------------------------------------- */
  9. /* Demonstration of String++ methods.                                   */
  10. /* -------------------------------------------------------------------- */
  11.  
  12. #include <ctype.h>
  13. #include <stdio.h>
  14. #include <conio.h>
  15. #include <stdlib.h>
  16.  
  17. #if defined (__ZTC__)
  18. #include <disp.h>
  19. #define _NOCURSOR DISP_NONDISPLAY
  20. #define _NORMALCURSOR DISP_CURSORHALF
  21. #define _setcursortype(k) disp_setcursortype(k)
  22. #define clrscr() disp_eeop()
  23. #endif
  24.  
  25. #ifdef BCCL
  26. #include <strng.h>
  27. #include <iostream.h>
  28. #else
  29. #include "str.h"
  30. #endif
  31.  
  32. #include "regexp.h"
  33.  
  34. void pause(void);
  35.  
  36. void StrIntro()
  37. {
  38.   clrscr();
  39.   _setcursortype(_NOCURSOR);
  40.  
  41.   String title1 = "String++ Version 3.00";
  42.   String title2 = "Written by Carl W. Moreland";
  43.   String title3 = "Demonstration of methods & operators";
  44.   String title4 = "Hit any key to continue...";
  45.   String title5 = "or <Ctrl>C to exit...";
  46.  
  47.   cout << "\n\n\n\n\n\n\n\n";
  48.   cout << justify(title1, CENTER, 78) << "\n";
  49.   cout << justify(title2, CENTER, 78) << "\n\n";
  50.   cout << justify(title3, CENTER, 78) << "\n\n";
  51.   cout << justify(title4, CENTER, 78) << "\n";
  52.   cout << justify(title5, CENTER, 78) << "\n";
  53.  
  54.   pause();
  55. }
  56.  
  57. void StrConstr()
  58. {
  59.   cout << "Create a String and assign it \"Hello World.\":\n";
  60.   String str1 = "Hello World.";
  61.   cout << "String str1 = \"" << str1 << "\";\n\n";
  62.  
  63.   cout << "The String contents are returned by the () operator:\n";
  64.   cout << "str1() = " << str1 << "\n\n";
  65.  
  66.   cout << "Now assign str1 to a second String:\n";
  67.   String str2 = str1;
  68.   cout << "String str2 = str1;\n";
  69.   cout << "str2() = " << str2 << "\n\n";
  70.  
  71.   cout << "We can also assign numeric values to strings:\n";
  72.   str2 = 1024;
  73.   cout << "str2 = 1024;\n";
  74.   cout << "str2() = " << str2 << "\n\n";
  75.  
  76.   cout << "Create multiple characters by passing an optional multiplier to\n";
  77.   cout << "  the String constructor:\n\n";
  78.   str2 = "/* " + String('-', 40) + " */";
  79.   cout << "str2 = \"/* \" + String(\'-\', 40) + \" */\";\n";
  80.   cout << "str2() = " << str2() << "\n\n";
  81.  
  82.   pause();
  83. }
  84.  
  85. void StrContents()
  86. {
  87.   String str1 = "Hello World.";
  88.  
  89.   cout << "Placing a number in the () operator returns the substring\n";
  90.   cout << "  of the String starting at that number:\n";
  91.   cout << "str1(6) = " << str1(6) << "\n\n";
  92.  
  93.   cout << "Placing a second number in the () operator limits the substring\n";
  94.   cout << "  to that many characters:\n";
  95.   cout << "str1(6,2) = " << str1(6,2) << "\n\n";
  96.  
  97.   cout << "The nth character is returned by the [] operator:\n";
  98.   cout << "str1[6] = " << str1[6] << "\n\n";
  99.  
  100.   cout << "The [] operator can also be used to replace the nth character:\n";
  101.   str1[6] = 'w';
  102.   cout << "str1[6] = 'w';\n";
  103.   cout << "str1() = " << str1 << "\n\n";
  104.  
  105.   cout << "Use the left(), mid(), & right() functions to return substrings:\n\n";
  106.   cout << " left(str1, 5)    = " << left(str1, 5)   << "\n";
  107.   cout << "  mid(str1, 3, 2) = " << mid(str1, 3, 2) << "\n";
  108.   cout << "right(str1, 6)    = " << right(str1, 6)  << "\n\n";
  109.  
  110.   cout << "The length of str1 is given by the Length() member function:\n";
  111.   cout << "str1.Length() = " << str1.Length() << "\n\n";
  112.  
  113.   pause();
  114. }
  115.  
  116. void StrAddOp()
  117. {
  118.   cout << "Create a new String with the contents \"only\":\n\n";
  119.   String str1 = "only";
  120.   cout << "String str1 = \"" << str1 << "\";\n\n";
  121.  
  122.   cout << "Now use the + operator to add to it:\n\n";
  123.   str1 = "This is " + str1 + " a test";
  124.   cout << "str1 = \"This is \" + str1 + \" a test\";\n";
  125.   cout << "str1() = " << str1() << "\n\n";
  126.  
  127.   cout << "Create a new String and use the += operator to append to it:\n\n";
  128.   String str2 = "Please ";
  129.   cout << "String str2 = \"" << str2 << "\";\n\n";
  130.   str2 += "stand by...";
  131.   cout << "str2 += \"stand by...\";\n";
  132.   cout << "str2() = " << str2() << "\n\n";
  133.  
  134.   cout << "Use the inserter operator to chain appendages:\n\n";
  135.   String str3;
  136.   str3 << "The value of " << 'x' << " is " << 100;
  137.   cout << "str3 \<< \"The value of \" \<< 'x' \<< \" is \" \<< 100;\n";
  138.   cout << "str3() = " << str3() << "\n\n";
  139.  
  140.   pause();
  141. }
  142.  
  143. void StrMiscOp()
  144. {
  145.   String str1 = "Hello world.";
  146.  
  147.   cout << "The == operator will work for String == String, String == char*,\n";
  148.   cout << "  or for char* == String:\n\n";
  149.   if(str1 == "Hello world.")
  150.     cout << "str1 == \"Hello world.\"\n";
  151.   else
  152.     cout << "str1 != \"Hello world.\"\n";
  153.  
  154.   if("Hello world." == str1)
  155.     cout << "\"Hello world.\" == str1\n\n";
  156.   else
  157.     cout << "\"Hello world.\" != str1\n\n";
  158.  
  159.   cout << "Let's create a String that's equal to str1*2:\n\n";
  160.   String str2 = str1*2;
  161.   cout << "String str2 = str1*2;\n";
  162.   cout << "str2() = " << str2() << "\n\n";
  163.  
  164.   cout << "Now multiply str2 by 2:\n\n";
  165.   str2 *= 2;
  166.   cout << "str2 *= 2;\n";
  167.   cout << "str2() = " << str2() << "\n\n";
  168.  
  169.   pause();
  170. }
  171.  
  172. void StrNumbers()
  173. {
  174.   cout << "The String constructor can also accept numbers. In the case of\n";
  175.   cout << " floating point numbers, you can also pass a format specifier\n";
  176.   cout << " which is stored and used in future conversions.\n\n";
  177.  
  178.   String str1 = 1024;
  179.   cout << "str1 = 1024;\n";
  180.   cout << "str1() = " << str1 << "\n";
  181.   str1 = 655360L;
  182.   cout << "str1 = 655360L;\n";
  183.   cout << "str1() = " << str1 << "\n\n";
  184.  
  185.   str1 = String(123.456);
  186.   cout << "str1 = String(123.456);\n";
  187.   cout << "str1() = " << str1 << "\n";
  188.   str1 = String(3.14159, "%10.4f");
  189.   cout << "str1 = String(3.14159, \"%10.4f\");\n";
  190.   cout << "str1() = " << str1 << "\n";
  191.   str1 = 123.456;
  192.   cout << "str1 = 123.456;\n";
  193.   cout << "str1() = " << str1 << "\n";
  194.   Str.SetFloatFormat("%1.4e");
  195.   str1 = String(1.6e-19);
  196.   cout << "Str.SetFloatFormat(\"%1.4e\");\n";
  197.   cout << "str1 = String(1.6e-19);\n";
  198.   cout << "str1() = " << str1 << "\n";
  199.   str1 = 123.456;
  200.   cout << "str1 = 123.456;\n";
  201.   cout << "str1() = " << str1 << "\n\n";
  202.  
  203.   pause();
  204. }
  205.  
  206. void StrToUpper()
  207. {
  208.   String str1 = "Hello World.";
  209.  
  210.   cout << "The C-style function toupper() will return the upper case version\n";
  211.   cout << "  of a String without changing the String itself, whereas the\n";
  212.   cout << "  member function toUpper() will convert the String internally:\n\n";
  213.  
  214.   cout << "str1() = " << str1 << "\n";
  215.   cout << "toupper(str1) = " << toupper(str1) << "\n";
  216.   cout << "str1() = " << str1 << "\n";
  217.   str1.toUpper();
  218.   cout << "str1.toUpper();\n";
  219.   cout << "str1() = " << str1 << "\n\n";
  220.  
  221.   pause();
  222. }
  223.  
  224. void StrInsDel()
  225. {
  226.   String str1 = "This is only a test";
  227.   cout << "str1() = " << str1() << "\n\n";
  228.  
  229.   cout << "The Delete() member function can be used to delete a substring:\n\n";
  230.   str1.Delete(8, 5);
  231.   cout << "str1.Delete(8, 5);\n";
  232.   cout << "str1() = " << str1() << "\n\n";
  233.  
  234.   cout << "The Insert() member function can be used to insert a substring:\n\n";
  235.   str1.Insert(8, "still ");
  236.   cout << "str1.Insert(8, \"still \");\n";
  237.   cout << "str1() = " << str1() << "\n\n";
  238.  
  239.   cout << "The Replace() member function can be used to insert a substring\n";
  240.   cout << " either by replacing another substring or by replacing a given\n";
  241.   cout << " length of characters at a position:\n\n";
  242.  
  243.   str1.Replace("is still", "continues to be");
  244.   cout << "str1.Replace(\"is still\", \"continues to be\");\n";
  245.   cout << "str1() = " << str1() << "\n\n";
  246.   str1.Replace(5, 15, "is no longer");
  247.   cout << "str1.Replace(5, 15, \"no longer\");\n";
  248.   cout << "str1() = " << str1() << "\n";
  249.  
  250.   pause();
  251. }
  252.  
  253. void StrJustify()
  254. {
  255.   cout << "The justify() function will expand a String to a total width of n\n";
  256.   cout << "  by adding blanks and justify the non-blank portion:\n\n";
  257.  
  258.   String str1 = "Hello world.";
  259.   String str1a = "│" + justify(str1, LEFT, 20)   + "│";
  260.   String str1b = "│" + justify(str1, CENTER, 20) + "│";
  261.   String str1c = "│" + justify(str1, RIGHT, 20)  + "│";
  262.  
  263.   cout << "String str1 = \"" << str1 << "\";\n\n";
  264.   cout << "str1a = \"│\" + justify(str1, LEFT, 20)   + \"│\";\n";
  265.   cout << "str1b = \"│\" + justify(str1, CENTER, 20) + \"│\";\n";
  266.   cout << "str1c = \"│\" + justify(str1, RIGHT, 20)  + \"│\";\n";
  267.   cout << "str1a() = " << str1a() << "\n";
  268.   cout << "str1b() = " << str1b() << "\n";
  269.   cout << "str1c() = " << str1c() << "\n";
  270.  
  271.   cout << "\nHere's what happens when clipping is used:\n\n";
  272.   str1a = "│" + justify(str1, LEFT, 8, CLIP)   + "│";
  273.   str1b = "│" + justify(str1, CENTER, 8, CLIP) + "│";
  274.   str1c = "│" + justify(str1, RIGHT, 8, CLIP)  + "│";
  275.  
  276.   cout << "str1a = \"│\" + justify(str1, LEFT, 8, CLIP)   + \"│\";\n";
  277.   cout << "str1b = \"│\" + justify(str1, CENTER, 8, CLIP) + \"│\";\n";
  278.   cout << "str1c = \"│\" + justify(str1, RIGHT, 8, CLIP)  + \"│\";\n";
  279.   cout << "str1a() = " << str1a() << "\n";
  280.   cout << "str1b() = " << str1b() << "\n";
  281.   cout << "str1c() = " << str1c() << "\n";
  282.  
  283.   pause();
  284. }
  285.  
  286. void StrTrim()
  287. {
  288.   cout << "The trim() function will remove leading and trailing whitespace:\n\n";
  289.   String str1 = "\t\t  Hello World. \t ";
  290.   cout << "String str1 = \"\\t\\t  Hello World. \\t \";\n\n";
  291.  
  292.   String str1a = trim(str1, LEFT);
  293.   cout << "str1a = trim(str1, LEFT);\n";
  294.   cout << "str1a() = │" << str1a() << "│\n\n";
  295.   String str1b = trim(str1, RIGHT);
  296.   cout << "str1b = trim(str1, RIGHT);\n";
  297.   cout << "str1b() = │" << str1b() << "│\n\n";
  298.   String str1c = trim(str1);
  299.   cout << "str1c = trim(str1);\n";
  300.   cout << "str1c() = │" << str1c() << "│\n\n";
  301.  
  302.   cout << "You can also specify the character to be trimmed:\n\n";
  303.   str1 = "Here we go again..........";
  304.   cout << "str1 = " << str1 << "\n";
  305.   str1.Trim(RIGHT, '.');
  306.   cout << "str1.Trim(RIGHT, '.');\n";
  307.   cout << "str1 = " << str1 << "\n";
  308.  
  309.   pause();
  310. }
  311.  
  312. void StrFind()
  313. {
  314.   int pos;
  315.   String str1 = "d:\\prog\\turboc\\str";
  316.  
  317.   cout << "FindFirst() returns the location of the first instance of a \n";
  318.   cout << " substring in a String. FindNext() will return the location of\n";
  319.   cout << " subsequent instances. FindLast() finds the last instance, and\n";
  320.   cout << " FindPrev() finds subsequent previous instances.\n\n";
  321.  
  322.   cout << "String str1 = \"" << str1 << "\";\n\n";
  323.  
  324.   pos = str1.FindFirst("\\");
  325.   cout << "str1.FindFirst(\"\\\") = " << pos << "\n";
  326.  
  327.   while((pos = str1.FindNext()) != -1)
  328.     cout << "str1.FindNext() = " << pos << "\n";
  329.  
  330.   pos = str1.FindLast("r");
  331.   cout << "\nstr1.FindLast(\"r\") = " << pos << "\n";
  332.  
  333.   while((pos = str1.FindPrev()) != -1)
  334.     cout << "str1.FindPrev() = " << pos << "\n";
  335.  
  336.   pause();
  337. }
  338.  
  339. void Awk()
  340. {
  341.   int i, pos, num;
  342.   String *array;
  343.   String str1 = "HELLO WORLD.";
  344.   String str3 = "This is only a test";
  345.   String str4 = "Please stand by...";
  346.  
  347.   cout << "The following are AWK functions.\n\n";
  348.  
  349.   cout << "index() returns the location of a substring in a String:\n\n";
  350.   pos = index(str1, "WOR");
  351.   cout << "str1() = " << str1 << "\n";
  352.   cout << "pos = index(str1, \"WOR\";\n";
  353.   cout << "pos = " << pos << "\n";
  354.  
  355.   pause();
  356.  
  357.   cout << "split() will split a String at a given substring delimiter:\n\n";
  358.   String str7 = "d:\\prog\\turboc\\str";
  359.   num = split(str7, array, "\\");
  360.  
  361.   cout << "String str7 = \"d:\\prog\\turboc\\str\";\n";
  362.   cout << "num = split(str7, array, \"\\\");\n\n";
  363.  
  364.   cout << "In this example, str7 is split using the \\ character as the\n";
  365.   cout << "  delimiter. The results are placed in array, which now contains:\n\n";
  366.   for(i=0; i<num; i++)
  367.     cout << "array[" << i << "] = " << array[i] << "\n";
  368.  
  369.   pause();
  370.  
  371.   cout << "gsub() performs a global substitution. In this example, we want to\n";
  372.   cout << "  replace all \\'s with /'s:\n\n";
  373.   cout << "str7() = " << str7 << "\n";
  374.   i = gsub("\\", "/", str7);
  375.   cout << "i = gsub(\"\\\", \"/\", str7);\n";
  376.   cout << "str7() = " << str7 << "\n";
  377.   cout << "i = " << i << "\n";
  378.  
  379.   pause();
  380.  
  381.   cout << "sub() performs a one-time substitution:\n\n";
  382.   cout << "str1() = " << str1 << "\n";
  383.   i = sub("LO", "P ME,", str1);
  384.   cout << "i = sub(\"LO\", \"P ME,\", str1);\n";
  385.   cout << "str1() = " << str1 << "\n";
  386.   cout << "i = " << i << "\n";
  387.  
  388.   pause();
  389.  
  390.   cout << "substr() returns a substring of the String starting at n. If a\n";
  391.   cout << "  a third parameter is given, it represents the maximum number\n";
  392.   cout << "  of characters to return\n\n";
  393.  
  394.   String str_3 = substr(str3, 8);
  395.   String str_4 = substr(str4, 7, 5);
  396.   cout << "str3() = " << str3 << "\n";
  397.   cout << "substr(str3, 8) = " << str_3 << "\n\n";
  398.   cout << "str4() = " << str4 << "\n";
  399.   cout << "substr(str4, 7, 5) = " << str_4 << "\n\n";
  400.  
  401.   pause();
  402. }
  403.  
  404. void RegularExpr()
  405. {
  406.   String str1 = "void *ptr = &var;    // assign the address of var to ptr";
  407.  
  408.   cout << "Regular expressions can be used to extract comments from a file.\n";
  409.   cout << "Assume the following line of code is read into String str1:\n\n";
  410.   cout << str1 << "\n\n";
  411.  
  412.   String str1a;
  413.   Regexp re1 = "//.*";
  414.   if(match(str1, re1) != -1)
  415.     str1a = substr(str1, RSTART, RLENGTH);
  416.  
  417.   cout << "Regexp re1 = \"" << re1  << "\";\n";
  418.   cout << "if(match(str1, re1) != -1)\n";
  419.   cout << "  str1a = substr(str1, RSTART, RLENGTH);\n\n";
  420.   cout << "str1a() = " << str1a << "\n";
  421.  
  422.   pause();
  423.  
  424.   cout << "We can use regular expressions to test for a data type.\n\n";
  425.   Regexp reFloat  = "^[+-]?([0-9]+[.]?[0-9]*$|[.][0-9]+$)";
  426.   Regexp reExpNot = "^[+-]?([0-9]+[.]?[0-9]*|[.][0-9]+)([eE][+-]?[0-9]+)?$";
  427.   cout << "Regexp reFloat  = \"" << reFloat  << "\";\n";
  428.   cout << "Regexp reExpNot = \"" << reExpNot << "\";\n\n";
  429.  
  430.   String str2 = "-1.23";
  431.   String str3 = "+1.6e-19";
  432.  
  433.   cout << "String str2 = \"" << str2 << "\";\n";
  434.   cout << "String str3 = \"" << str3 << "\";\n\n";
  435.  
  436.   cout << "if(str2 == reFloat)\n";
  437.   cout << "  cout << \"str2 is type float\\n\";\n";
  438.   cout << "if(str3 == reExpNot)\n";
  439.   cout << "  cout << \"str3 is exponential notation\\n\";\n\n";
  440.  
  441.   if(str2 == reFloat)
  442.     cout << "str2 is type float\n";
  443.   if(str3 == reExpNot)
  444.     cout << "str3 is exponential notation\n";
  445.  
  446.   pause();
  447. }
  448.  
  449. main()
  450. {
  451.   char ch;
  452.   int i;
  453.   const int n = 14;
  454.   String s[n];
  455.  
  456.   s[0]  = "String++ Version 3.0 Main Menu";
  457.   s[1]  = "(a)    Constructors       ";
  458.   s[2]  = "(b)    Contents           ";
  459.   s[3]  = "(c)    Addition           ";
  460.   s[4]  = "(d)    Misc operators     ";
  461.   s[5]  = "(e)    Numbers            ";
  462.   s[6]  = "(f)    toupper            ";
  463.   s[7]  = "(g)    Insert/Delete      ";
  464.   s[8]  = "(h)    Justification      ";
  465.   s[9]  = "(i)    Trim               ";
  466.   s[10] = "(j)    Find               ";
  467.   s[11] = "(k)    AWK functions      ";
  468.   s[12] = "(l)    Regular Expressions";
  469.   s[13] = "(x)    Exit               ";
  470.  
  471.   for(i=0; i<n; i++)
  472.     s[i].Justify(CENTER, 78, NOTRIM);
  473.  
  474.   StrIntro();
  475.  
  476.   while(1)
  477.   {
  478.     cout << "\n\n" << s[0] << "\n\n";
  479.     for(i=1; i<n-1; i++)
  480.       cout << s[i] << "\n";
  481.     cout << "\n" << s[13] << "\n";
  482.  
  483.     while(1)
  484.     {
  485.       ch = tolower(getch());
  486.       if(!ch)
  487.       {
  488.         getch();
  489.         continue;
  490.       }
  491.       switch(ch)
  492.       {
  493.         case 'a': clrscr(); StrConstr();   break;
  494.         case 'b': clrscr(); StrContents(); break;
  495.         case 'c': clrscr(); StrAddOp();    break;
  496.         case 'd': clrscr(); StrMiscOp();   break;
  497.         case 'e': clrscr(); StrNumbers();  break;
  498.         case 'f': clrscr(); StrToUpper();  break;
  499.         case 'g': clrscr(); StrInsDel();   break;
  500.         case 'h': clrscr(); StrJustify();  break;
  501.         case 'i': clrscr(); StrTrim();     break;
  502.         case 'j': clrscr(); StrFind();     break;
  503.         case 'k': clrscr(); Awk();         break;
  504.         case 'l': clrscr(); RegularExpr(); break;
  505.         case 'x': clrscr(); _setcursortype(_NORMALCURSOR); exit(0);
  506.         default: continue;
  507.       }
  508.       break;
  509.     }
  510.   }
  511. }
  512.  
  513. void pause(void)
  514. {
  515.   char ch = getch();
  516.   if(!ch)
  517.     getch();
  518.   if(ch == 0x03)
  519.   {
  520.     _setcursortype(_NORMALCURSOR);
  521.     exit(0);
  522.   }
  523.   clrscr();
  524.   cout << "\n";
  525. }
  526.